package dao;

import java.util.List;

import org.hibernate.Query;
import org.hibernate.SQLQuery;
import org.hibernate.transform.Transformers;
/**
 * 查询通用DAO
 * @author wjm
 *
 */
public class QueryDAO extends BaseHibernateDAO {
	
	private Object object = null;
	private List list = null;
	
	/**
	 * 单值查询
	 * @param hql 查询语句
	 * @param obj 动态参数
	 * @return	
	 */
	public Object queryUnique(String hql, Object...obj){
		Query query = getQuery(hql);
		bindParams(query, obj);
		object = query.setMaxResults(1).uniqueResult();
//		HibernateSessionFactory.closeSession();
		return object;
	}
	/**
	 * 多条件查询
	 * @param hql 查询语句
	 * @param obj 参数集合
	 * @return
	 */
	public List query(String hql, Object...obj){
		Query query = getQuery(hql);
		bindParams(query, obj);
		list = query.list();
//		HibernateSessionFactory.closeSession();
		return list;
	}
	
	/**
	 * 多条件分页查询
	 * @param hql 查询语句
	 * @param page 当前页
	 * @param pageSize 页大小
	 * @param obj 动态参数集合
	 * @return
	 */
	public List queryByPage(String hql, int page, int pageSize, Object...obj){
		Query query = getQuery(hql);
		bindParams(query, obj);
		query.setFirstResult((page - 1) * pageSize);
		query.setMaxResults(pageSize);
		list = query.list();
//		HibernateSessionFactory.closeSession();
		return list;
	}
	
	
	
	/**
	 * 多条件分页查询
	 * @param hql 查询语句
	 * @param page 当前页
	 * @param pageSize 页大小
	 * @param obj 动态参数集合
	 * @return
	 */
	public List queryByPages(String sql, int page, int pageSize, Object...obj){
		Query query=getSession().createSQLQuery(sql).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
		bindParams(query, obj);
		query.setFirstResult((page - 1) * pageSize);
		query.setMaxResults(pageSize);
		list=query.list();
//		HibernateSessionFactory.closeSession();
		return list;
	}
	
	public List queryListSQL(String sql,Object...obj){
		Query query=getSession().createSQLQuery(sql).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
		bindParams(query, obj);
		list=query.list();
		return list;
	}
	
	/**
	 * 单值查询
	 * @param hql 查询语句
	 * @param obj 动态参数
	 * @return	
	 */
	public Object queryUniques(String sql, Object...obj){
    	SQLQuery sqlquery=getSession().createSQLQuery(sql);
		bindParams(sqlquery, obj);
		object = sqlquery.setMaxResults(1).uniqueResult();
//		HibernateSessionFactory.closeSession();
		return object;
	}
	
	public int queryExcute(String sql, Object...obj){
		SQLQuery sqlquery=getSession().createSQLQuery(sql);
		bindParams(sqlquery, obj);
		return sqlquery.executeUpdate();
	}
	
	public List querySelect(String sql, Object...obj){
		SQLQuery sqlquery=getSession().createSQLQuery(sql);
		bindParams(sqlquery, obj);
		return sqlquery.list();
	}
	
	/**
	 * 获得query对象
	 * @param hql 查询语句
	 * @return
	 */
	public Query getQuery(String hql){
		Query query = getSession().createQuery(hql);
		return query;
	}
	
	/**
	 * 参数绑定
	 * @param query 查询对象
	 * @param obj 参数集合
	 */
	private void bindParams(Query query,Object...obj){
		if(obj != null){
			for (int i = 0; i < obj.length; i++) {
				query.setParameter(i, obj[i]);
			}
		}
	}
	
	/**
	 * 清理缓存
	 * @param obj
	 * @return
	 */
	public Object clearCache(Object obj){
		//public LogBox merge(LogBox detachedInstance) {
			try {
				Object result = getSession().merge(obj);
				return result;
			} catch (RuntimeException re) {
				throw re;
			}
		//}
	}

}
